#ifndef _SAFETY_APP_H_
#define _SAFETY_APP_H_

#include "safety_board.h"

#if _SAFETY_VERIFYFUNCTION_ENABLE_

// 删除用户任务延时启动时间     - 500ms
#define SAFETY_DELAY_OF_DELETE_USER                    (500ul)
// 上电延时                   - 2s
#define SAFETY_POWERUP_TASK_DELAY                      (2000ul)
// 用户权限鉴定任务延时启动时间 - 1.5s
#define  SAFETY_DELAY_OF_IDENTIFY_USER_RIGHTS          (1500ul)
// 本地注册用户任务延时启动时间 - 3s
#define SAFETY_DELAY_OF_LOCAL_REGISTER_USER            (3ul)

// 最大发送次数(默认5，最大不超31)
#define SAFETY_MAX_NUMBER_OF_SEND                      (5ul)
// 最大执行状态查询次数
#define SAFETY_MAX_NUMBER_OF_QUERY                     (20ul)

// 发送超时
#define SAFETY_MESSAGE_SENGING_RATED_TIME              (1000ul)
// 重新查询报文执行状态间隔时间
#define SAFETY_INTERVAL_OF_QUERY_EXECUTE_STATUS        (1500ul)

/**
 * @brief 命令表
 *
 */
typedef enum
{
  SAFETY_IDLE,                   // 空闲
  SAFETY_SELF_TEST,              // 自检
  SAFETY_FACTORY_SETTING,        // 设备恢复出厂
  SAFETY_GET_EIGENVALUE_FILE,    // 获取特征值文件
  SAFETY_LOCAL_REGISTER_USER,    // 本地注册用户
  SAFETY_FORCED_TO_GOTO_SLEEP,   // 进入睡眠
  SAFETY_IDENTIFY_USER_RIGHTS,   // 鉴定用户权限
  SAFETY_DELETE_SPECIFIC_USER,   // 删除特定用户
  SAFETY_REGISTER_BY_EIGENVALUE, // 通过特征值注册用户
} SafetyCommandTable_t;

/**
 * @brief 报文收发步骤
 *
 */
typedef enum
{
  SAFETY_DEVICE_IDLE,                // 设备空闲
  SAFETY_LOAD_TIMEOUT,               // 加载超时
  SAFETY_USER_ACTION_TIMEOUT,        // 用户操作超时
  SAFETY_USER_ACTION_RESPONSE,       // 响应用户操作
  SAFETY_COMMUNICATIONS_ANOMALY,     // 通讯异常
  SAFETY_COMMAND_EXECUTE_FAILURE,    // 命令执行失败
  SAFETY_PREPARATION_FOR_SENDING,    // 发送前的准备
  SAFETY_MESSAGE_DELIVERY_TIMEOUT,   // 报文发送超时
  SAFETY_MESSAGE_RESPONSE_COMPLETE,  // 报文响应完毕
  SAFETY_MESSAGE_RESPONSE_EXCEPTION, // 报文响应异常
} SafetyMessageExecuteStep_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  uint8_t DeleteIdent       : 1; // 用户待删除标志
  uint8_t TransmitIdent     : 1; // 传输使能标志
  uint8_t MessageBusyIdent  : 1; // 消息繁忙标志
  uint8_t NumberOfTimesSent : 5; // 发送次数

  uint8_t NumberOfRetries;                           // 重试次数
  uint32_t CommandTimeout;                           // 命令超时
  SafetyCommandTable_t CurrentCommand;               // 当前命令
  SafetyMessageExecuteStep_t MessageExecuteStep;     // 报文响应步骤
  SafetyCommandExecuteResult_t CommandExecuteResult; // 命令执行结果
} SafetyBitStatus_t;
#endif

/**
 * @brief 获取设备活跃标志
 *
 * @return bool - 活跃标志（true：活跃 false：静默）
 */
extern bool SafetyGetDeviceActiveEn(void);

/**
 * @brief 获取已注册用户数量
 *
 * @return uint8_t - 已注册用户数量
 */
extern uint8_t SafetyGetTheNumberOfUsers(void);

/**
 * @brief 获取设备序列号
 *
 * @param pSerialNumberOut - 设备序列号
 */
extern void SafetyGetTheModuleSerialNumber(char *pSerialNumberOut);

/**
 * @brief 获取固件版本号
 *
 * @param pVersionOut - 固件版本号
 */
extern void SafetyGetTheModuleApplicationVersion(char *pVersionOut);

/**
 * @brief 获取算法版本号
 *
 * @param pVersionOut - 固算法版本号
 */
extern void SafetyGetTheModuleAlgorithmVersion(char *pVersionOut);

/**
 * @brief 启动强制进入睡眠任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartForcedToGotoSleepTask(void);

/**
 * @brief 启动设备自检任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartDeviceSelfTestTask(void);

/**
 * @brief 启动恢复出厂设置任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartDeviceFactorySettingTask(void);

/**
 * @brief 启动获取特定用户的特征值文件任务
 *
 * @param UserId - 用户编码
 * @return bool  - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartGetUserSpecificEigenvalueFilesTask(uint16_t UserId);

/**
 * @brief 启动本地注册用户任务
 *
 * @return bool  - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartLocalRegisterUserTask(void);

/**
 * @brief 启动用户权限鉴定任务
 *
 * @return bool  - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartUserAuthenticationTask(void);

/**
 * @brief 启动删除特定用户任务
 *
 * @param DeleteUserId  - 待删除的任务
 * @return bool         - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartDeletingSpecificUsersTask(uint16_t DeleteUserId);

/**
 * @brief 启动通过特征值注册用户任务
 *
 * @return bool  - 启动状态（true：成功 false：失败）
 */
extern bool SafetyStartRegisteringUsersByFeatureValueTask(void);

/**
 * @brief 初始化外部验证模组相关功能
 *
 */
extern void SafetyConfiguration(void);

#endif
